package org.jetlinks.pro.things;

import org.jetlinks.core.things.MetadataId;
import org.jetlinks.core.things.ThingId;
import reactor.core.Disposable;
import reactor.core.publisher.Mono;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

/**
 * 物连接器管理器,用于管理连接器,并从连接器中获取数据进行持久化等处理.
 *
 * @author zhouhao
 * @see ThingsDataRepository
 * @since 1.12
 */
public interface ThingsConnectorManager {

    /**
     * 给指定到物注册一个连接器,表示将连接器中的数据绑定到指定到物实例,可调用返回值{@link Disposable#dispose()}来注销此连接器
     *
     * @param thingId   物ID
     * @param connector 连接器
     * @return Disposable
     */
    @Nonnull
    Disposable register(@Nonnull ThingId thingId,
                        @Nonnull MetadataId metadataId,
                        @Nonnull ThingsConnector connector,
                        boolean template);

    /**
     * 获取物的连接器
     *
     * @param thingId 物ID
     * @return ThingsConnector
     */
    Mono<ThingsConnector> getConnector(@Nonnull ThingId thingId, @Nonnull MetadataId metadataId);

    /**
     * 移除连接器,如果物模型ID为null,则移除全部
     *
     * @param thingId    物ID
     * @param metadataId 物模型ID
     * @return void
     */
    Mono<Void> removeConnector(@Nonnull ThingId thingId, @Nullable MetadataId metadataId);
}
